/** Keriosity, ESIR 2
 * 	BluetoothConnection (Modele): classe permettant de commander notre robot 
 *  grace a une connexion bluetooth
 *	@author: GOUYET Brett
 *	@date: 10/03/2012
 */

package keriosity.connection;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;

/**classe permettant de commander notre robot grace a une connexion bluetooth **/
public class BluetoothConnection implements IConnection{

	protected BluetoothDevice _device = null;
	protected BluetoothSocket _socket = null;
	protected OutputStream _outStream = null;	
	protected boolean _connectionState = false; 
		
	
	/** CONSTRUCTEUR **/
	public BluetoothConnection() {}
	
	
	/** Methode permettant de se connecter au robot en bluetooth 
	 * @param String: nom du robot
	 * @return boolean: vrai si on s'est connecte, faux sinon
	 **/
	public boolean connect(String name) {
		 
		if(!this.isConnected()){ //on verifie si on est pas deja connecte
		 
			if(this.find(name)){ //si on trouve le robot, on se connecte
				 
				new Thread() {
					
					public void run() {
						try {	
							_socket.connect(); //on se connecte	
							_connectionState = true; 
						} catch (IOException e) {}
					}
				}.start(); //on lance le thread qui emet
				return true;
			}
			return false; //erreur on a pas trouve
		}
		return false; //erreur on est deja connecte
	}
	
		
	/** Methode find() permettant de trouver Keriosity en bluetooth
	 * utilisee par la methode connect
     * @param String name: nom du robot a trouver
     * @return boolean: vrai si on a trouve le robot, faux sinon
     */
	public boolean find(String name) {
	      
        //on capte l'ensemble des appareils equipes de bluetooth
        Set<BluetoothDevice> setDevice = BluetoothAdapter.getDefaultAdapter().getBondedDevices(); 
        BluetoothDevice[] device = (BluetoothDevice[]) setDevice.toArray(new BluetoothDevice[setDevice.size()]); //on cree la liste des appareils
       
        //On cherche notre robot dans les appareils detectes
       for(int i = 0 ; i < device.length; i++){	        	
           
            if(device[i].getName().contains(name)) { //on a trouve Keriosity!!
             
            	_device = device[i]; 
                try {  //on cree le socket
                   	_socket = _device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                	_outStream = _socket.getOutputStream();//canal permettant d'emettre des donnees   	
                	return true;
                } catch (IOException e) {return false;}      
            }
        }
        return false; //on a pas trouve notre robot
	 }
		
	
	/** Methode envoyant les instructions a Keriosity
     * @param String : ordre 
     * @return boolean: vrai si on a reussit a envoyer, faux sinon
     */
	public boolean send(String order) {
	      
    	try {
    		if(this.isConnected()){
    			_outStream.write(order.getBytes()); //on ecrit les ordres dans le buffer     
    			_outStream.flush(); //on verifie que l'envoi a fonctionne	 
    			return true;
			}
			return false;
        }
    	catch (IOException e) {return false;}
	 }
	 
	 
	/** Methode fermant la connexion 
	 * @return boolean: vrai si on s'est deconnecte, faux sinon
	 **/
	public boolean disconnect() {
		
		try {
			if(isConnected()){ //on verifie qu'on est connecte
				_socket.close(); //on ferme la connexion
				_connectionState = false;
				return true; //on a reussi a se deconnecter
			}
			return false; 
		} catch (IOException e) {return false;}
	 }

	 
	/** Methode donnant le statut de la connection 
	 * @return boolean: vrai si connecte, faux sinon
	 **/
	public boolean isConnected() {
		return _connectionState;
	}
}
